總算來個阿峻廢言
想蓋一個伐木場,你的伐木工要先"七哈"個100個木頭
-----阿峻20190923
咱們今天要來介紹CNN網路的計算過程的基本幾個結構計算,也就是Input丟進一個網絡到算出東西所需要的計算方式,這也是 Forward 計算,主要我們會介紹這幾種計算 : Convolution 、 Pooling 以及 Activation計算。這些作為 CNN 以及其他DL結構的計算基礎,只要我們熟習掌握後,面對其他延伸結構我們能夠更好的接受XD
我們依樣參考上一章的圖
從這張圖我們依次看到 Convolution layer、Activation layer 以及pooling layer,我們依次來介紹各種 layer 的運算行為為何?
首先在 Convolution layer我們要提到我們最重要的計算模式 -- Convolution 計算 ,但這麼快直接跳進去我們大概會出事,所以我們先提一下幾個設定:
1.為求簡單,我們先設定我們的 Input 圖片為一張一個 channal 的2D 圖片,例如是一張灰階照片,而像是彩色RGB照片為 3 個 Channal 這樣。這張照片只有 5 * 5 大小,每個像素值只有0或1 (當然正常的灰階照片值域在0~255)
2.我們有一個filter(或者也稱為 kernal),大小為 3 * 3,是用來與input進行 convolution 計算,得到我們的 feature map
3. Feature map 為我們這個 convolution 計算的結果,上面內涵著我們從Input萃取出來的資訊
4. Convolution 計算規則如下:
依照定義,連續的2D convolution 計算規則如下:
但我們今天是2D的一格一格進行convolution計算,因此是屬於離散的,所以也別慌,公式會像下面這樣:
5. 在進行 Convolution 計算時,細心的你或許會發現,诶~我算完了這3 * 3 格Input與kernal的convolution之後,那下一輪要從哪裡開始算呢?是移動一格,還是移動整整三格不要重複算到已經算到的部分在開始算,這是可以介紹一個概念叫做 "Stride" 意思就是步幅,就是你這 Kernal 每次跟 Input 上的 3 * 3 算完之後往旁邊移動的像素數,當然我們可以直覺發現如果Stride越大,那Kernal跟Image做完整個 convolution 的次數越少,所產生的feature map越小,舉個例子齁:
6. 诶诶,上面那張圖怎麼多了一個新名詞 "Padding" ,這又是啥QQQQ 細心的你或許想過,我們的 kernal 今天算到邊邊時,以 5 * 5 image 為例子,你的kernal中間已經移動到Image邊號為5的位置,阿這個不是不能算嗎?我們Image又沒有第6格可以給 kernal 做 convolution ,那怎麼辦QQQ旁邊補0或者啥的呀XDD "Padding" 就是定義在整個 Image外面我們要做甚麼處裡,常見的有 Zero-Padding(如下圖),注意input最外圈填0的部分就是 padding加上去的,當然也有改成填1的paading方法:
7. 結合上面的幾個的動圖整個convolution可以參考下面動圖:
如果大家看不到上面這張這可以看下面這一張XD
Imgur
除了convolution,還有 Activation Function、Pooling Layer,下一次我們會來介紹有哪些種類以及效果會是如何。